﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Windows;
using CalculoPreciosUnitarios.BaseDeDatos.cotizararticuloDataSetTableAdapters;
using CalculoPreciosUnitarios.Logica.GestorObject.Unidad;

namespace CalculoPreciosUnitarios.Logica.GestorBaseDeDatos.Unidad
{
    public class UnidadBD
    {

        #region CRUD Unidad

        /// <summary>
        /// Agrega una nueva unidad
        /// </summary>
        /// <param name="unidad"> Unidad a Agregar</param>
        /// <param name="confirmacion"> Para cuando se agrega masivamente por Excel</param>
        /// <returns>1 Exito; 0 Fallido</returns>
        public int AddUnidad(UnidadCS unidad, bool confirmacion)
        {
            int resultadoConsulta = 0;
            
            UnidadCS _unidadAux = new UnidadCS();
            _unidadAux.IdUnidad = unidad.IdUnidad;

            unidadesTableAdapter unidadTA = new unidadesTableAdapter();

            unidadTA.Connection.Open();

            _unidadAux = ObtenerUnidadPorCodigo(unidad);

            try
            {
                if (_unidadAux.IdUnidad.Equals(""))
                {
                    resultadoConsulta = unidadTA.InsertUnidad(unidad.IdUnidad, unidad.Descripcion);

                    if (resultadoConsulta == 1 && confirmacion)
                        MessageBox.Show("Unidad " + unidad.Descripcion + " con Codigo " + unidad.IdUnidad + " Agregado!");
                }
            }
            catch (Exception e)
            {
                MessageBox.Show("Error AddUnidad(unidad) -- Clase UnidadDB " + e.Message);
            }
            finally
            {
                unidadTA.Connection.Close();
            }

            return resultadoConsulta;
        }

        /// <summary>
        /// Actualiza la unidad pasada
        /// </summary>
        /// <param name="idUnidad">El codigo de Unidad</param>
        /// <param name="descripcion">La descripcion a actualizar</param>
        /// <param name="nuevoCodigo">El nuevo codigo para la unidad</param>
        /// <returns>1 Exito; 0 Fallido</returns>
        private int UpdateUnidad(string idUnidad, string descripcion, string nuevoCodigo)
        {
            int resultadoConsulta = 0;

            unidadesTableAdapter unidadTA = new unidadesTableAdapter();

            unidadTA.Connection.Open();

            try
            {
                resultadoConsulta = unidadTA.UpdateUnidad(nuevoCodigo, descripcion, idUnidad);
            }
            catch (Exception e)
            {
                MessageBox.Show("Error UpdateUnidad(idUnidad, descripcion, nuevoCodigo) -- Clase UnidadDB " + e.Message);
            }
            finally
            {
                unidadTA.Connection.Close();
            }

            return resultadoConsulta;
        }

        /// <summary>
        /// Obtiene la unidad por el codigo pasado
        /// </summary>
        /// <param name="unidad">La unidad que tiene el codigo buscado</param>
        /// <returns>La unidad buscada; Vacio si no la encuentra</returns>
        public UnidadCS ObtenerUnidadPorCodigo(UnidadCS unidad)
        {
            UnidadCS resultado = new UnidadCS();

            unidadesTableAdapter unidadTA = new unidadesTableAdapter();

            unidadTA.Connection.Open();

            try
            {
                DataTable tablaConsulta = unidadTA.GetDataByObtenerUnidadPorCodigo("%" + unidad.IdUnidad + "%");

                if (tablaConsulta.Rows.Count > 0)
                {
                    foreach (DataRow item in tablaConsulta.Rows)
                    {
                        resultado.IdUnidad = item["Id_unidad"].ToString();
                        resultado.Descripcion = item["descrip_unidad"].ToString();
                    }
                }
            }
            catch (Exception e)
            {
                MessageBox.Show("Error en ObtenerUnidadPorCodigo(unidad) -- Clase UnidadDB " + e.Message);
            }
            finally
            {
                unidadTA.Connection.Close();
            }

            return resultado;
        }

        public UnidadCS ObtenerUnidadPorCodigoExacto(UnidadCS unidad)
        {
            UnidadCS resultado = new UnidadCS();

            unidadesTableAdapter unidadTA = new unidadesTableAdapter();

            unidadTA.Connection.Open();

            try
            {
                DataTable tablaConsulta = unidadTA.GetDataByObtenerUnidadPorCodigo(unidad.IdUnidad);

                if (tablaConsulta.Rows.Count > 0)
                {
                    foreach (DataRow item in tablaConsulta.Rows)
                    {
                        resultado.IdUnidad = item["Id_unidad"].ToString();
                        resultado.Descripcion = item["descrip_unidad"].ToString();
                    }
                }
            }
            catch (Exception e)
            {
                MessageBox.Show("Error en ObtenerUnidadPorCodigo(unidad) -- Clase UnidadDB " + e.Message);
            }
            finally
            {
                unidadTA.Connection.Close();
            }

            return resultado;
        }

        /// <summary>
        /// Borra la Unidad
        /// </summary>
        /// <param name="vieja"></param>
        /// <param name="nueva"></param>
        /// <returns></returns>
        /// 
        private int EliminarUnidad(string codigo)
        {
            unidadesTableAdapter unidadTA = new unidadesTableAdapter();
            
            int resultadoConsulta = 0;
            
            unidadTA.Connection.Open();

            try
            {
                resultadoConsulta = unidadTA.DeleteUnidad(codigo);
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message + " Error -- Class UnidadDB -- Methods EliminarUnidad(string codigo)", "Cuidado", MessageBoxButton.OK);
            }
            finally
            {
                unidadTA.Connection.Close();
            }

            return resultadoConsulta;
        }

        #endregion

        /// <summary>
        /// Actualizar la unidad pasada por parametro
        /// </summary>
        /// <param name="vieja">La unidad a actualizar</param>
        /// <param name="nueva">La unidad actualizada</param>
        /// <returns>1 Exito; 0 Fallido</returns>
        public int UpdateUnidad(UnidadCS vieja, UnidadCS nueva)
        {
            return UpdateUnidad(vieja.IdUnidad, vieja.Descripcion, nueva.IdUnidad);
        }

        /// <summary>
        /// Elimina la unidad pasada como parametro
        /// </summary>
        /// <param name="unidad">La unidad a eliminar</param>
        /// <returns>1 Exitoso; 0 Fallido</returns>
        public int EliminarUnidad(UnidadCS unidad)
        {
           return EliminarUnidad(unidad.IdUnidad);
        }

        /// <summary>
        /// Cambia el codigo de la Unidad pasada
        /// </summary>
        /// <param name="vieja">La Unidad con el codigo viejo</param>
        /// <param name="nueva">La Unidad con el codigo nuevo</param>
        /// <returns>1 Exitoso; 0 Fallido</returns>
        public int CambiarCodigoUnidad(UnidadCS vieja, UnidadCS nueva)
        {
            UnidadCS unidad = ObtenerUnidadPorCodigo(vieja);
            return UpdateUnidad(unidad, nueva);
        }

        /// <summary>
        /// Devuelve una lista con todas las unidades disponibles
        /// </summary>
        /// <returns>Las Unidades disponibles</returns>
        public List<UnidadCS> obteneUnidades()
        {
            List<UnidadCS> _unidades = new List<UnidadCS>();
            unidadesTableAdapter dbUnidad = new unidadesTableAdapter();

            dbUnidad.Connection.Open();
            try
            {
                DataTable tablaUnidad = dbUnidad.GetDataByGetUnidades();

                if (tablaUnidad.Rows.Count > 0)
                {
                    foreach (DataRow items in tablaUnidad.Rows)
                    {
                        UnidadCS dataUniad = new UnidadCS();
                        dataUniad.IdUnidad = items["Id_unidad"].ToString();
                        dataUniad.Descripcion = items["descrip_unidad"].ToString();
                        _unidades.Add(dataUniad);
                    }
                }
            }
            catch (Exception mException)
            {
                MessageBox.Show("Error: Classs UnidadBD - metodo: obteneUnidades :: " + mException.Message, "Cuidado", MessageBoxButton.OK);
            }
            finally
            {
                dbUnidad.Connection.Close();
            }

            return _unidades;
        }

        /// <summary>
        /// Carga las unidades de la lista pasada por parametro
        /// </summary>
        /// <param name="unidades">La lista con las unidades a cargar</param>
        /// <returns>1 Exitoso; 0 Fallido</returns>
        public int CargarUnidades(List<UnidadCS> unidades)
        {
            int resultadoConsulta = 1;
            
            if (unidades.Count > 0)
            {
                foreach (UnidadCS item in unidades)
                {
                    resultadoConsulta *= AddUnidad(item, false);
                }
            }

            return resultadoConsulta;
        }
    }
}